
#ifndef __LIBERTY_ENGINE_LIBERTY3D_H__
#define __LIBERTY_ENGINE_LIBERTY3D_H__

#ifdef USE_BOOST_PTR
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

namespace std {
    using boost::shared_ptr;
    using boost::weak_ptr;
}

#else
#include <memory>
#endif

namespace boost {
    class shared_mutex;
};

namespace Liberty { namespace Engine {
    class Behaviour;
    class Component;
    class ComponentFactory;
    class Context;
    class Coroutine;
    class CoroutineEntry;
    class EndOfCoroutine;
    class Game;
    class GameObject;
    class GLException;
    class MemoryManager;
    class Object;
    class Path;
    class Performance;
    class Quaternion;
    class RwMutex;
    class Texture;
    class Texture2D;
    class Uuid;
    class Vector3;
    class WaitForEndOfFrame;
    class WaitForFixedUpdate;
    class WaitForSeconds;
    class Win32Exception;
    class Window;
    class YieldInstruction;

    class IAssetFile;
    class IComponentFactory;
    class IMemoryListener;
    class IMutableAssetFile;
    class IObjectMethod;
    class IOperation;
    class ISerializable;
    class ISerializableFactory;
    class ISerializer;

    enum TextureFormatEnum {
        Unknown = -1,
        RGB24  = 2,
        ARGB32 = 3
    };

    typedef enum TextureFormatEnum TextureFormat;

    template <typename RT, typename T> class ObjectMethod;
}}

namespace Liberty { namespace Library {
    class AssetBuildData;
    class AssetCachedData;
    class AssetImporter;
    class AssetContextFolderBase;
    class MappedAsset;
    class Task;
    class TaskScheduler;
    class TextureBuildData;
    class TextureCachedData;
    class TextureImporter;

    class IAsset;
    class IAssetContext;
    class IAssetDepot;
    class IAssetDepotListener;
    class IAssetImporterFactory;
    class IMutex;
    class ISharedMutex;

    enum ObjectStatusEnum {
        InSync,
        ModifiedInMemory,
        ModifiedInDepot
    };

    typedef enum ObjectStatusEnum ObjectStatus;

    template <typename AssetType> class AssetContextFolder;
    template <typename Type, typename Functor, typename Queuer, typename ThisMutexProvider, typename LockObject> class SyncedProcessQueue;

    template <typename MutexProvider, typename Base, typename ObjectType> class MappedObjectMutex;
    template <typename MutexProvider, typename Base, typename ObjectType> class MappedObjectUpgradableLock;
    template <typename MutexProvider, typename Base, typename ObjectType> class MappedObjectUpgradedLock;
    template <typename MutexProvider, typename Base, typename ObjectType> class MappedObjectUniqueLock;
    template <typename MutexProvider, typename ObjectType> class MappedObjectMutexProvider;
    template <typename MutexProvider, typename ObjectType> class MappedObject;
}}

#endif
